//package com.fc.config.shiro;
//
//
//import at.pollux.thymeleaf.shiro.dialect.ShiroDialect;
//import com.fc.config.shiro.filter.URLPathMatchingFilter;
//import org.apache.shiro.authc.credential.HashedCredentialsMatcher;
//import org.apache.shiro.authc.pam.FirstSuccessfulStrategy;
//import org.apache.shiro.mgt.SecurityManager;
//import org.apache.shiro.realm.Realm;
//import org.apache.shiro.spring.LifecycleBeanPostProcessor;
//import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
//import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
//import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
//import org.springframework.context.annotation.Bean;
//import org.springframework.context.annotation.Configuration;
//
//import javax.servlet.Filter;
//import java.util.*;
//
//
//@Configuration
//public class ShiroConfig {
//
//    @Bean
//    public static LifecycleBeanPostProcessor getLifecycleBeanPostProcessor() {
//        return new LifecycleBeanPostProcessor();
//    }
//
//    /**
//     * ShiroFilterFactoryBean 处理拦截资源文件问题。
//     * 注意：单独一个ShiroFilterFactoryBean配置是或报错的，因为在
//     * 初始化ShiroFilterFactoryBean的时候需要注入：SecurityManager
//     *
//     Filter Chain定义说明
//     1、一个URL可以配置多个Filter，使用逗号分隔
//     2、当设置多个过滤器时，全部验证通过，才视为通过
//     3、部分过滤器可指定参数，如perms，roles
//     *
//     */
//    @Bean
//    public ShiroFilterFactoryBean shirFilter(SecurityManager securityManager){
//        System.out.println("ShiroConfiguration.shirFilter()");
//        ShiroFilterFactoryBean shiroFilterFactoryBean  = new ShiroFilterFactoryBean();
//
//        // 必须设置 SecurityManager
//        shiroFilterFactoryBean.setSecurityManager(securityManager);
//        //拦截器的url
//        Map<String,String> filterChainDefinitionMap = new LinkedHashMap<String,String>();
//        //自定义拦截器
//        Map<String, Filter> customisedFilter = new HashMap<String, Filter>();
//        customisedFilter.put("url", getURLPathMatchingFilter());
//
//        //配置映射关系
//        filterChainDefinitionMap.put("/admin/login", "anon");//登录
//        filterChainDefinitionMap.put("/admin/logout", "anon");//登出
//        filterChainDefinitionMap.put("/common/randomImage", "anon");//获取验证码
//        filterChainDefinitionMap.put("/common/upload", "anon");
//
//        //用户端api不要拦截
//        filterChainDefinitionMap.put("/sysuser/**", "anon");
//        filterChainDefinitionMap.put("/user/**", "anon");
//
//
//        //websocket不要拦截
//        filterChainDefinitionMap.put("/websocket/**","anon");
//        //设置API文档不要被拦截
//        filterChainDefinitionMap.put("/swagger-resources", "anon");
//        filterChainDefinitionMap.put("/swagger-resources/configuration/ui", "anon");
//        filterChainDefinitionMap.put("/v2/api-docs", "anon");
//        filterChainDefinitionMap.put("/doc.html", "anon");
//        //设置一些静资源不要拦截
//        filterChainDefinitionMap.put("/**/*.js", "anon");
//        filterChainDefinitionMap.put("/**/*.css", "anon");
//        filterChainDefinitionMap.put("/**/*.html", "anon");
//        filterChainDefinitionMap.put("/**/*.svg", "anon");
//        filterChainDefinitionMap.put("/**/*.pdf", "anon");
//        filterChainDefinitionMap.put("/**/*.jpg", "anon");
//        filterChainDefinitionMap.put("/**/*.jpeg", "anon");
//        filterChainDefinitionMap.put("/**/*.webp", "anon");
//        filterChainDefinitionMap.put("/**/*.woff", "anon");
//        filterChainDefinitionMap.put("/**/*.woff2", "anon");
//        filterChainDefinitionMap.put("/**/*.ttf", "anon");
//        filterChainDefinitionMap.put("/**/*.gif", "anon");
//        filterChainDefinitionMap.put("/**/*.map", "anon");
//        filterChainDefinitionMap.put("/**/*.xlsx", "anon");
//        filterChainDefinitionMap.put("/**/*.mp4", "anon");
//        //Spring自带的favico.cio设置不要拦截
//        filterChainDefinitionMap.put("/**/*.ico", "anon");
//        filterChainDefinitionMap.put("/**/*.png", "anon");
//        //如果使用默认拦截器，所有不加anno的路径都要走authc拦截器
////        filterChainDefinitionMap.put("/**", "authc");
//        //使用自定义拦截器，所有未加anon的路径都要走这
//        filterChainDefinitionMap.put("/**", "url");
//        shiroFilterFactoryBean.setFilters(customisedFilter);
//        shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
//        return shiroFilterFactoryBean;
//    }
//
//    public URLPathMatchingFilter getURLPathMatchingFilter() {
//        return new URLPathMatchingFilter();
//    }
//
//
//    @Bean
//    public SecurityManager securityManager(){
//        DefaultWebSecurityManager securityManager =  new DefaultWebSecurityManager();
//        securityManager.setRealm(getShiroRelam());
//        return securityManager;
//    }
//
//
//    @Bean
//    public ShiroRelam getShiroRelam(){
//        return new ShiroRelam();
//    }
//
//    /**
//     * 整合shiro和thymeleaf
//     * @return
//     */
//    @Bean
//    public ShiroDialect getShiroDialect(){
//        return new ShiroDialect();
//    }
//
//
//
//    /**
//     * 凭证匹配器
//     * （由于我们的密码校验交给Shiro的SimpleAuthenticationInfo进行处理了
//     *  所以我们需要修改下doGetAuthenticationInfo中的代码;
//     * ）
//     * 因为我们的密码是交给shiro校验的，所以我们要告诉shiro我们是如何对密码进行加密的
//     * @return
//     */
//    @Bean
//    public HashedCredentialsMatcher hashedCredentialsMatcher(){
//        HashedCredentialsMatcher hashedCredentialsMatcher = new HashedCredentialsMatcher();
//        hashedCredentialsMatcher.setHashAlgorithmName("md5");//散列算法:这里使用MD5算法;
//        hashedCredentialsMatcher.setHashIterations(2);//散列的次数，比如散列两次，相当于 md5(md5(""));
//        return hashedCredentialsMatcher;
//    }
//
//
//    /**
//     *  开启shiro aop注解支持.
//     *  使用代理方式;所以需要开启代码支持;
//     * @param securityManager
//     * @return
//     */
//    @Bean
//    public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager){
//        AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();
//        authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);
//        return authorizationAttributeSourceAdvisor;
//    }
//}
